package com.yzf.enterprise.framework.web.domain;

import java.util.List;

/**
 * tk插件基础服务接口
 *
 * @author AKing31
 * @version 1.0
 * @since 2019-12-18 3:44 下午
 */
public interface BaseTkService<T extends BaseTkEntity> {

    /**
     * 根据主键字段进行查询，方法参数必须包含完整的主键属性，查询条件使用等号
     *
     * @param key 主键
     * @return 实体对象
     */
    T selectByPrimaryKey(Object key);

    /**
     * 查询一个
     *
     * @param param 查询条件
     * @return 一个实体对象
     */
    T selectOne(T param);

    /**
     * 查询结果集
     *
     * @param param 查询条件
     * @return 实体对象集合
     */
    List<T> select(T param);


    /**
     * 批量插入，支持批量插入的数据库可以使用，例如MySQL,H2等，另外该接口限制实体包含`id`属性并且必须为自增列
     *
     * @param recordList 批量插入的数据
     * @return 插入成功的条数
     */
    int batchInsert(List<T> recordList);

    /**
     * 保存一个实体，null的属性不会保存，会使用数据库默认值
     *
     * @param record 插入的数据
     * @return 成功插入条数
     */
    int insertSelective(T record);


    /**
     * 根据实体属性作为条件进行删除，查询条件使用等号
     *
     * @param record 条件
     * @return 成功删除条数
     */
    int delete(T record);


    /**
     * 逻辑删除，实际为update的一种
     *
     * @param record 更新信息
     * @return 逻辑删除的条数
     */
    int remove(T record);

    /**
     * 根据主键更新属性不为null的值
     *
     * @param record 更新信息
     * @return 更新的条数
     */
    int updateByPrimaryKeySelective(T record);

    /**
     * 批量逻辑删除
     * 只针对项目中多次用的该方法，使用时，mapper里面必须添加batchRemove方法，
     *
     * @param ids        主键ids
     * @param updateUser 删除人
     * @return 条数
     */
    int batchRemove(Long[] ids, String updateUser);

    /**
     * 返回id的保存
     *
     * @param record 保存信息
     * @return 保存条数
     */
    int insertUseGeneratedKeys(T record);
}
